{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Reinplementation of Block Coordinate Descent (BCD) Algorithm for Training DNNs (10-layer MLP) for MNIST in PyTorch"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Import libraries"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "PyTorch Version: 1.0.0\n",
      "Torchvision Version: 0.2.1\n",
      "GPU is available? True\n"
     ]
    }
   ],
   "source": [
    "\"\"\"\n",
    "5 runs, seed = 5, 10, 15, 8, 19; \n",
    "validation accuracies: 0.8721, 0.8695, 0.8564, 0.8713, 0.8617\n",
    "\"\"\"\n",
    "from __future__ import print_function, division\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.nn.functional as F\n",
    "from torch.autograd import Variable\n",
    "import torch.optim as optim\n",
    "import torchvision\n",
    "from torchvision import datasets, models, transforms, utils\n",
    "from torch.utils.data import Dataset, DataLoader\n",
    "import matplotlib.pyplot as plt\n",
    "import time\n",
    "import os\n",
    "import copy\n",
    "\n",
    "print(\"PyTorch Version:\", torch.__version__)\n",
    "print(\"Torchvision Version:\", torchvision.__version__)\n",
    "print(\"GPU is available?\", torch.cuda.is_available())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Read in MNIST dataset"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "dtype = torch.float\n",
    "device = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")\n",
    "\n",
    "# Convert to tensor and scale to [0, 1]\n",
    "ts = transforms.Compose([transforms.ToTensor(), \n",
    "                             transforms.Normalize((0,), (1,))])\n",
    "mnist_trainset = datasets.MNIST('../data', train=True, download=True, transform=ts)\n",
    "mnist_testset = datasets.MNIST(root='../data', train=False, download=True, transform=ts)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Data manipulation"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Manipulate train set\n",
    "x_d0 = mnist_trainset[0][0].size()[0]\n",
    "x_d1 = mnist_trainset[0][0].size()[1]\n",
    "x_d2 = mnist_trainset[0][0].size()[2]\n",
    "N = x_d3 = len(mnist_trainset)\n",
    "K = 10\n",
    "x_train = torch.empty((N,x_d0*x_d1*x_d2), device=device)\n",
    "y_train = torch.empty(N, dtype=torch.long)\n",
    "for i in range(N): \n",
    "     x_train[i,:] = torch.reshape(mnist_trainset[i][0], (1, x_d0*x_d1*x_d2))\n",
    "     y_train[i] = mnist_trainset[i][1]\n",
    "x_train = torch.t(x_train)\n",
    "y_one_hot = torch.zeros(N, K).scatter_(1, torch.reshape(y_train, (N, 1)), 1)\n",
    "y_one_hot = torch.t(y_one_hot).to(device=device)\n",
    "y_train = y_train.to(device=device)\n",
    "\n",
    "# Manipulate test set\n",
    "N_test = x_d3_test = len(mnist_testset)\n",
    "x_test = torch.empty((N_test,x_d0*x_d1*x_d2), device=device)\n",
    "y_test = torch.empty(N_test, dtype=torch.long)\n",
    "for i in range(N_test): \n",
    "     x_test[i,:] = torch.reshape(mnist_testset[i][0], (1, x_d0*x_d1*x_d2))\n",
    "     y_test[i] = mnist_testset[i][1]\n",
    "x_test = torch.t(x_test)\n",
    "y_test_one_hot = torch.zeros(N_test, K).scatter_(1, torch.reshape(y_test, (N_test, 1)), 1)\n",
    "y_test_one_hot = torch.t(y_test_one_hot).to(device=device)\n",
    "y_test = y_test.to(device=device)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Main algorithm (Jinshan's Algorithm in Zeng et al (2018))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Define parameter initialization and forward pass"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Initialization of parameters\n",
    "seed = 15\n",
    "torch.manual_seed(seed)\n",
    "if torch.cuda.is_available():\n",
    "    torch.manual_seed(seed)\n",
    "def initialize(dim_in, dim_out):\n",
    "    W = 0.01*torch.randn(dim_out, dim_in, device=device)\n",
    "    b = 0.1*torch.ones(dim_out, 1, device=device)\n",
    "    return W, b\n",
    "\n",
    "# Forward pass\n",
    "def feed_forward(weight, bias, activation, dim = N):\n",
    "    U = torch.addmm(bias.repeat(1, dim), weight, activation)\n",
    "    V = nn.ReLU()(U)\n",
    "    return U, V"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Define functions for updating blocks"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "def updateV(U1,U2,W,b,rho,gamma): \n",
    "    _, d = W.size()\n",
    "    I = torch.eye(d, device=device)\n",
    "    U1 = nn.ReLU()(U1)\n",
    "    _, col_U2 = U2.size()\n",
    "    Vstar = torch.mm(torch.inverse(rho*(torch.mm(torch.t(W),W)) + gamma*I), \\\n",
    "                     rho*torch.mm(torch.t(W),U2-b.repeat(1,col_U2)) + gamma*U1)\n",
    "    return Vstar"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "def updateWb(U, V, W, b, alpha, rho): \n",
    "    d,N = V.size()\n",
    "    I = torch.eye(d, device=device)\n",
    "    _, col_U = U.size()\n",
    "    Wstar = torch.mm(alpha*W + rho*torch.mm(U - b.repeat(1,col_U),torch.t(V)),\\\n",
    "                     torch.inverse(alpha*I + rho*(torch.mm(V,torch.t(V)))))\n",
    "    bstar = (alpha*b+rho*torch.sum(U-torch.mm(W,V), dim=1).reshape(b.size()))/(rho*N + alpha)\n",
    "    return Wstar, bstar"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Define the proximal operator of the ReLU activation function"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "def relu_prox(a, b, gamma, d, N):\n",
    "    val = torch.empty(d,N, device=device)\n",
    "    x = (a+gamma*b)/(1+gamma)\n",
    "    y = torch.min(b,torch.zeros(d,N, device=device))\n",
    "\n",
    "    val = torch.where(a+gamma*b < 0, y, torch.zeros(d,N, device=device))\n",
    "    val = torch.where(((a+gamma*b >= 0) & (b >=0)) | ((a*(gamma-np.sqrt(gamma*(gamma+1))) <= gamma*b) & (b < 0)), x, val)\n",
    "    val = torch.where((-a <= gamma*b) & (gamma*b <= a*(gamma-np.sqrt(gamma*(gamma+1)))), b, val)\n",
    "    return val"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Define hyperparameters"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "gamma = 1\n",
    "rho = 1\n",
    "alpha = 1"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Define block update"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "def block_update(Wn, bn, Wn_1, bn_1, Vn, Un, Vn_1, Un_1, Vn_2, dn_1, alpha = alpha, gamma = gamma, rho = rho, dim = N):\n",
    "    # update W(n) and b(n)\n",
    "    Wn, bn = updateWb(Un, Vn_1, Wn, bn, alpha, rho)\n",
    "    # update V(n-1)\n",
    "    Vn_1 = updateV(Un_1, Un, Wn, bn, rho, gamma)\n",
    "    # update U(n-1)\n",
    "    Un_1 = relu_prox(Vn_1, (rho*torch.addmm(bn_1.repeat(1,dim), Wn_1, Vn_2) + \\\n",
    "                            alpha*Un_1)/(rho + alpha), (rho + alpha)/gamma, dn_1, dim)\n",
    "    return Wn, bn, Vn_1, Un_1"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Define loss computation of layers"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "def compute_loss(weight, bias, activation, preactivation, rho = rho):\n",
    "    loss = rho/2*torch.pow(torch.dist(torch.addmm(bias.repeat(1,N), \\\n",
    "                                                  weight, activation), preactivation, 2), 2).cpu().numpy()\n",
    "    return loss"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Parameter initialization"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Layers: input + 3 hidden + output\n",
    "d0 = x_d1*x_d2\n",
    "d1 = d2 = d3 = d4 = d5 = d6 \\\n",
    "= d7 = d8 = d9 = d10 = 600\n",
    "d11 = K \n",
    "\n",
    "\n",
    "W1, b1 = initialize(d0, d1)\n",
    "W2, b2 = initialize(d1, d2)\n",
    "W3, b3 = initialize(d2, d3)\n",
    "W4, b4 = initialize(d3, d4)\n",
    "W5, b5 = initialize(d4, d5)\n",
    "W6, b6 = initialize(d5, d6)\n",
    "W7, b7 = initialize(d6, d7)\n",
    "W8, b8 = initialize(d7, d8)\n",
    "W9, b9 = initialize(d8, d9)\n",
    "W10, b10 = initialize(d9, d10)\n",
    "W11, b11 = initialize(d10, d11)\n",
    "\n",
    "\n",
    "U1, V1 = feed_forward(W1, b1, x_train)\n",
    "U2, V2 = feed_forward(W2, b2, V1)\n",
    "U3, V3 = feed_forward(W3, b3, V2)\n",
    "U4, V4 = feed_forward(W4, b4, V3)\n",
    "U5, V5 = feed_forward(W5, b5, V4)\n",
    "U6, V6 = feed_forward(W6, b6, V5)\n",
    "U7, V7 = feed_forward(W7, b7, V6)\n",
    "U8, V8 = feed_forward(W8, b8, V7)\n",
    "U9, V9 = feed_forward(W9, b9, V8)\n",
    "U10, V10 = feed_forward(W10, b10, V9)\n",
    "U11 = torch.addmm(b11.repeat(1, N), W11, V10)\n",
    "V11 = U11\n",
    "\n",
    "niter = 300\n",
    "loss1 = np.empty(niter)\n",
    "loss2 = np.empty(niter)\n",
    "accuracy_train = np.empty(niter)\n",
    "accuracy_test = np.empty(niter)\n",
    "time1 = np.empty(niter)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Training algorithm"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 60000 samples, validate on 10000 samples\n",
      "Epoch 1 / 300 \n",
      " - time (s): 2.03668212890625 - sq_loss: 12100.4228515625 - tot_loss: 12750.018195139244 - acc: 0.09751666666666667 - val_acc: 0.0974\n",
      "Epoch 2 / 300 \n",
      " - time (s): 1.8025989532470703 - sq_loss: 6806.4873046875 - tot_loss: 6816.333756972104 - acc: 0.09751666666666667 - val_acc: 0.0974\n",
      "Epoch 3 / 300 \n",
      " - time (s): 1.9217307567596436 - sq_loss: 4667.748046875 - tot_loss: 4673.363541835919 - acc: 0.09751666666666667 - val_acc: 0.0974\n",
      "Epoch 4 / 300 \n",
      " - time (s): 1.7292356491088867 - sq_loss: 2995.873779296875 - tot_loss: 3000.2325409371406 - acc: 0.11245 - val_acc: 0.1135\n",
      "Epoch 5 / 300 \n",
      " - time (s): 1.7540373802185059 - sq_loss: 1886.3868408203125 - tot_loss: 1890.2372616752982 - acc: 0.11236666666666667 - val_acc: 0.1135\n",
      "Epoch 6 / 300 \n",
      " - time (s): 1.9505929946899414 - sq_loss: 1181.119140625 - tot_loss: 1184.7401469908655 - acc: 0.09871666666666666 - val_acc: 0.098\n",
      "Epoch 7 / 300 \n",
      " - time (s): 1.7596850395202637 - sq_loss: 738.0595703125 - tot_loss: 741.7433824678883 - acc: 0.11236666666666667 - val_acc: 0.1135\n",
      "Epoch 8 / 300 \n",
      " - time (s): 1.9042177200317383 - sq_loss: 460.7831726074219 - tot_loss: 464.01298265066 - acc: 0.09736666666666667 - val_acc: 0.0982\n",
      "Epoch 9 / 300 \n",
      " - time (s): 1.8320164680480957 - sq_loss: 287.5284118652344 - tot_loss: 290.66476045781747 - acc: 0.175 - val_acc: 0.1787\n",
      "Epoch 10 / 300 \n",
      " - time (s): 1.8627243041992188 - sq_loss: 179.36306762695312 - tot_loss: 182.68012791103683 - acc: 0.09736666666666667 - val_acc: 0.0982\n",
      "Epoch 11 / 300 \n",
      " - time (s): 1.8603370189666748 - sq_loss: 111.86795806884766 - tot_loss: 115.15618053590879 - acc: 0.11236666666666667 - val_acc: 0.1135\n",
      "Epoch 12 / 300 \n",
      " - time (s): 1.9363982677459717 - sq_loss: 69.76424407958984 - tot_loss: 72.97008259862196 - acc: 0.10441666666666667 - val_acc: 0.1028\n",
      "Epoch 13 / 300 \n",
      " - time (s): 1.793818712234497 - sq_loss: 43.504947662353516 - tot_loss: 46.68177520140307 - acc: 0.11236666666666667 - val_acc: 0.1135\n",
      "Epoch 14 / 300 \n",
      " - time (s): 1.828831434249878 - sq_loss: 27.129487991333008 - tot_loss: 30.424706020683516 - acc: 0.19991666666666666 - val_acc: 0.2033\n",
      "Epoch 15 / 300 \n",
      " - time (s): 1.8580825328826904 - sq_loss: 16.918405532836914 - tot_loss: 20.133903146837838 - acc: 0.14755 - val_acc: 0.1501\n",
      "Epoch 16 / 300 \n",
      " - time (s): 1.9623377323150635 - sq_loss: 10.55129337310791 - tot_loss: 14.2279380709806 - acc: 0.17881666666666668 - val_acc: 0.1866\n",
      "Epoch 17 / 300 \n",
      " - time (s): 2.0102686882019043 - sq_loss: 6.580859184265137 - tot_loss: 9.35194986211718 - acc: 0.10218333333333333 - val_acc: 0.101\n",
      "Epoch 18 / 300 \n",
      " - time (s): 1.8306443691253662 - sq_loss: 4.104936122894287 - tot_loss: 7.07210557826329 - acc: 0.0993 - val_acc: 0.1032\n",
      "Epoch 19 / 300 \n",
      " - time (s): 1.8225197792053223 - sq_loss: 2.5611441135406494 - tot_loss: 5.659873089782195 - acc: 0.24561666666666668 - val_acc: 0.2425\n",
      "Epoch 20 / 300 \n",
      " - time (s): 1.9377219676971436 - sq_loss: 1.5983095169067383 - tot_loss: 4.798480867510079 - acc: 0.28973333333333334 - val_acc: 0.2897\n",
      "Epoch 21 / 300 \n",
      " - time (s): 2.0288100242614746 - sq_loss: 0.9975665211677551 - tot_loss: 4.226601748843677 - acc: 0.16298333333333334 - val_acc: 0.1616\n",
      "Epoch 22 / 300 \n",
      " - time (s): 2.0026869773864746 - sq_loss: 0.6229127049446106 - tot_loss: 3.2805748824830516 - acc: 0.17775 - val_acc: 0.1771\n",
      "Epoch 23 / 300 \n",
      " - time (s): 1.8850948810577393 - sq_loss: 0.3890731632709503 - tot_loss: 3.753366149543581 - acc: 0.2698333333333333 - val_acc: 0.2685\n",
      "Epoch 24 / 300 \n",
      " - time (s): 1.9264743328094482 - sq_loss: 0.24309000372886658 - tot_loss: 3.3811955382407177 - acc: 0.26863333333333334 - val_acc: 0.269\n",
      "Epoch 25 / 300 \n",
      " - time (s): 2.019744873046875 - sq_loss: 0.15197737514972687 - tot_loss: 2.9989378043828765 - acc: 0.31343333333333334 - val_acc: 0.3183\n",
      "Epoch 26 / 300 \n",
      " - time (s): 1.8911747932434082 - sq_loss: 0.09505593776702881 - tot_loss: 2.8903405106975697 - acc: 0.46005 - val_acc: 0.4668\n",
      "Epoch 27 / 300 \n",
      " - time (s): 1.8036231994628906 - sq_loss: 0.05953989177942276 - tot_loss: 3.9640408230534376 - acc: 0.36056666666666665 - val_acc: 0.3611\n",
      "Epoch 28 / 300 \n",
      " - time (s): 1.9030914306640625 - sq_loss: 0.037341028451919556 - tot_loss: 2.9190418966536527 - acc: 0.35828333333333334 - val_acc: 0.3598\n",
      "Epoch 29 / 300 \n",
      " - time (s): 1.9305694103240967 - sq_loss: 0.02344326861202717 - tot_loss: 2.6627221961534815 - acc: 0.46491666666666664 - val_acc: 0.4635\n",
      "Epoch 30 / 300 \n",
      " - time (s): 2.0898685455322266 - sq_loss: 0.014752401039004326 - tot_loss: 2.9775721437399625 - acc: 0.33545 - val_acc: 0.3438\n",
      "Epoch 31 / 300 \n",
      " - time (s): 1.7857346534729004 - sq_loss: 0.00929966103285551 - tot_loss: 2.469516530407418 - acc: 0.4018833333333333 - val_acc: 0.4062\n",
      "Epoch 32 / 300 \n",
      " - time (s): 1.8626582622528076 - sq_loss: 0.005863676778972149 - tot_loss: 2.6636896643904038 - acc: 0.44255 - val_acc: 0.4459\n",
      "Epoch 33 / 300 \n",
      " - time (s): 1.8638837337493896 - sq_loss: 0.003712239908054471 - tot_loss: 2.7802454437842243 - acc: 0.4966333333333333 - val_acc: 0.4989\n",
      "Epoch 34 / 300 \n",
      " - time (s): 1.8756859302520752 - sq_loss: 0.002359305042773485 - tot_loss: 2.99980940981186 - acc: 0.4318166666666667 - val_acc: 0.4416\n",
      "Epoch 35 / 300 \n",
      " - time (s): 1.804727554321289 - sq_loss: 0.0015047276392579079 - tot_loss: 2.6657520954613574 - acc: 0.5693 - val_acc: 0.5781\n",
      "Epoch 36 / 300 \n",
      " - time (s): 1.772200345993042 - sq_loss: 0.0009667387930676341 - tot_loss: 2.9923172415838053 - acc: 0.5315666666666666 - val_acc: 0.5393\n",
      "Epoch 37 / 300 \n",
      " - time (s): 1.7606866359710693 - sq_loss: 0.0006151466513983905 - tot_loss: 2.9679602431424428 - acc: 0.5679 - val_acc: 0.5731\n",
      "Epoch 38 / 300 \n",
      " - time (s): 1.7429172992706299 - sq_loss: 0.00039943723822943866 - tot_loss: 2.889132620271994 - acc: 0.5824166666666667 - val_acc: 0.5883\n",
      "Epoch 39 / 300 \n",
      " - time (s): 1.7535083293914795 - sq_loss: 0.00025972374714910984 - tot_loss: 3.044404064759874 - acc: 0.5871666666666666 - val_acc: 0.5934\n",
      "Epoch 40 / 300 \n",
      " - time (s): 1.7535829544067383 - sq_loss: 0.0001709985954221338 - tot_loss: 2.824216879263986 - acc: 0.41695 - val_acc: 0.4288\n",
      "Epoch 41 / 300 \n",
      " - time (s): 1.7608840465545654 - sq_loss: 0.00011152740626130253 - tot_loss: 2.784586238648444 - acc: 0.4018 - val_acc: 0.4124\n",
      "Epoch 42 / 300 \n",
      " - time (s): 1.7388808727264404 - sq_loss: 7.815092976670712e-05 - tot_loss: 2.6396615250050672 - acc: 0.4703333333333333 - val_acc: 0.4714\n",
      "Epoch 43 / 300 \n",
      " - time (s): 1.7374098300933838 - sq_loss: 5.4479089158121496e-05 - tot_loss: 2.9605090112954713 - acc: 0.6384833333333333 - val_acc: 0.6432\n",
      "Epoch 44 / 300 \n",
      " - time (s): 1.7472622394561768 - sq_loss: 3.33225580106955e-05 - tot_loss: 3.1534144942816056 - acc: 0.52415 - val_acc: 0.5298\n",
      "Epoch 45 / 300 \n",
      " - time (s): 1.7580440044403076 - sq_loss: 2.3875041733845137e-05 - tot_loss: 2.999050814751172 - acc: 0.6540166666666667 - val_acc: 0.6634\n",
      "Epoch 46 / 300 \n",
      " - time (s): 1.7466707229614258 - sq_loss: 2.5888168238452636e-05 - tot_loss: 2.8448485561293637 - acc: 0.5752666666666667 - val_acc: 0.5918\n",
      "Epoch 47 / 300 \n",
      " - time (s): 1.7527744770050049 - sq_loss: 1.2905558833153918e-05 - tot_loss: 2.9281010543018056 - acc: 0.6719333333333334 - val_acc: 0.6796\n",
      "Epoch 48 / 300 \n",
      " - time (s): 1.7479543685913086 - sq_loss: 1.358191184408497e-05 - tot_loss: 2.7131543353589223 - acc: 0.6723166666666667 - val_acc: 0.6818\n",
      "Epoch 49 / 300 \n",
      " - time (s): 1.7423899173736572 - sq_loss: 9.099608178075869e-06 - tot_loss: 2.589310289954483 - acc: 0.5484166666666667 - val_acc: 0.5541\n",
      "Epoch 50 / 300 \n",
      " - time (s): 1.742067575454712 - sq_loss: 2.266671617690008e-05 - tot_loss: 2.9780241050793848 - acc: 0.5741166666666667 - val_acc: 0.585\n",
      "Epoch 51 / 300 \n",
      " - time (s): 1.7375900745391846 - sq_loss: 1.0868757271964569e-05 - tot_loss: 2.6681176375977884 - acc: 0.6301166666666667 - val_acc: 0.6379\n",
      "Epoch 52 / 300 \n",
      " - time (s): 1.750990867614746 - sq_loss: 7.279511464730604e-06 - tot_loss: 2.9331937991823906 - acc: 0.6104166666666667 - val_acc: 0.6098\n",
      "Epoch 53 / 300 \n",
      " - time (s): 1.7367644309997559 - sq_loss: 1.0453680260980036e-05 - tot_loss: 3.1980974741372847 - acc: 0.6577166666666666 - val_acc: 0.6617\n",
      "Epoch 54 / 300 \n",
      " - time (s): 1.7432396411895752 - sq_loss: 1.1216271559533197e-05 - tot_loss: 3.4227322581036788 - acc: 0.6662666666666667 - val_acc: 0.6697\n",
      "Epoch 55 / 300 \n",
      " - time (s): 1.7467186450958252 - sq_loss: 2.8645793008763576e-06 - tot_loss: 3.3084391963841426 - acc: 0.6195166666666667 - val_acc: 0.6278\n",
      "Epoch 56 / 300 \n",
      " - time (s): 1.739450454711914 - sq_loss: 2.098610821121838e-06 - tot_loss: 3.6239713465247405 - acc: 0.66255 - val_acc: 0.6655\n",
      "Epoch 57 / 300 \n",
      " - time (s): 1.7587172985076904 - sq_loss: 2.960579877253622e-06 - tot_loss: 2.981303539207147 - acc: 0.46675 - val_acc: 0.4726\n",
      "Epoch 58 / 300 \n",
      " - time (s): 1.7549302577972412 - sq_loss: 1.1484906281111762e-05 - tot_loss: 2.9077675380212895 - acc: 0.6926666666666667 - val_acc: 0.6949\n",
      "Epoch 59 / 300 \n",
      " - time (s): 1.7485413551330566 - sq_loss: 3.86360079573933e-06 - tot_loss: 2.7856763020499784 - acc: 0.70665 - val_acc: 0.7109\n",
      "Epoch 60 / 300 \n",
      " - time (s): 1.753666639328003 - sq_loss: 2.3335210244113114e-06 - tot_loss: 2.9781570482641655 - acc: 0.6746833333333333 - val_acc: 0.6717\n",
      "Epoch 61 / 300 \n",
      " - time (s): 1.7494351863861084 - sq_loss: 1.7137597296823515e-06 - tot_loss: 2.752997001519134 - acc: 0.7269166666666667 - val_acc: 0.7318\n",
      "Epoch 62 / 300 \n",
      " - time (s): 1.7493922710418701 - sq_loss: 1.0446801752550527e-05 - tot_loss: 2.6878077861729253 - acc: 0.7036666666666667 - val_acc: 0.7114\n",
      "Epoch 63 / 300 \n",
      " - time (s): 1.7443296909332275 - sq_loss: 7.810755960235838e-06 - tot_loss: 2.7541913559407476 - acc: 0.701 - val_acc: 0.7072\n",
      "Epoch 64 / 300 \n",
      " - time (s): 1.7456159591674805 - sq_loss: 2.527836386434501e-06 - tot_loss: 2.7302513261615786 - acc: 0.72335 - val_acc: 0.7345\n",
      "Epoch 65 / 300 \n",
      " - time (s): 1.7550127506256104 - sq_loss: 7.603459835081594e-06 - tot_loss: 2.580816021247756 - acc: 0.78735 - val_acc: 0.7926\n",
      "Epoch 66 / 300 \n",
      " - time (s): 1.75632905960083 - sq_loss: 4.483642442210112e-06 - tot_loss: 2.549601395226091 - acc: 0.76615 - val_acc: 0.7748\n",
      "Epoch 67 / 300 \n",
      " - time (s): 1.7453219890594482 - sq_loss: 2.162784994652611e-06 - tot_loss: 2.555260719869011 - acc: 0.748 - val_acc: 0.7562\n",
      "Epoch 68 / 300 \n",
      " - time (s): 1.7508492469787598 - sq_loss: 1.5428830693053897e-06 - tot_loss: 2.7444400445109522 - acc: 0.7449333333333333 - val_acc: 0.7513\n",
      "Epoch 69 / 300 \n",
      " - time (s): 1.7370576858520508 - sq_loss: 5.702348516933853e-06 - tot_loss: 2.7225374891954743 - acc: 0.72415 - val_acc: 0.7342\n",
      "Epoch 70 / 300 \n",
      " - time (s): 1.7570555210113525 - sq_loss: 9.627761755837128e-06 - tot_loss: 2.8962385634986276 - acc: 0.6949 - val_acc: 0.7059\n",
      "Epoch 71 / 300 \n",
      " - time (s): 1.7251849174499512 - sq_loss: 1.3204808055888861e-05 - tot_loss: 2.9025048907860764 - acc: 0.7539 - val_acc: 0.763\n",
      "Epoch 72 / 300 \n",
      " - time (s): 1.881934404373169 - sq_loss: 9.762123227119446e-06 - tot_loss: 2.6283613190826145 - acc: 0.7339833333333333 - val_acc: 0.7428\n",
      "Epoch 73 / 300 \n",
      " - time (s): 1.7730376720428467 - sq_loss: 1.602419615664985e-05 - tot_loss: 3.4083742601706035 - acc: 0.7106666666666667 - val_acc: 0.7151\n",
      "Epoch 74 / 300 \n",
      " - time (s): 1.7691333293914795 - sq_loss: 5.335577952791937e-06 - tot_loss: 2.8041257273307565 - acc: 0.7231 - val_acc: 0.7303\n",
      "Epoch 75 / 300 \n",
      " - time (s): 1.7660155296325684 - sq_loss: 1.5940154298732523e-06 - tot_loss: 3.391187370636999 - acc: 0.6899833333333333 - val_acc: 0.6998\n",
      "Epoch 76 / 300 \n",
      " - time (s): 1.734745979309082 - sq_loss: 6.213651431608014e-06 - tot_loss: 3.18597942865199 - acc: 0.7107 - val_acc: 0.718\n",
      "Epoch 77 / 300 \n",
      " - time (s): 1.7649638652801514 - sq_loss: 1.724697199279035e-06 - tot_loss: 2.6398381685454524 - acc: 0.7115333333333334 - val_acc: 0.7221\n",
      "Epoch 78 / 300 \n",
      " - time (s): 1.7485272884368896 - sq_loss: 2.808465069392696e-06 - tot_loss: 2.909899376270914 - acc: 0.7965 - val_acc: 0.7998\n",
      "Epoch 79 / 300 \n",
      " - time (s): 1.7493538856506348 - sq_loss: 3.1910406050883466e-06 - tot_loss: 2.6885741738026354 - acc: 0.7683833333333333 - val_acc: 0.7762\n",
      "Epoch 80 / 300 \n",
      " - time (s): 1.7490880489349365 - sq_loss: 2.0467196009121835e-06 - tot_loss: 2.9219505386063247 - acc: 0.7515833333333334 - val_acc: 0.7604\n",
      "Epoch 81 / 300 \n",
      " - time (s): 1.7794666290283203 - sq_loss: 4.990928118786542e-06 - tot_loss: 2.7038886991972504 - acc: 0.7443166666666666 - val_acc: 0.7506\n",
      "Epoch 82 / 300 \n",
      " - time (s): 1.753826379776001 - sq_loss: 2.8739884783135494e-06 - tot_loss: 3.100087744722032 - acc: 0.7893333333333333 - val_acc: 0.7972\n",
      "Epoch 83 / 300 \n",
      " - time (s): 1.7635252475738525 - sq_loss: 1.6744098729759571e-06 - tot_loss: 3.465141654110198 - acc: 0.7388333333333333 - val_acc: 0.7482\n",
      "Epoch 84 / 300 \n",
      " - time (s): 1.7440154552459717 - sq_loss: 9.628264706407208e-06 - tot_loss: 3.072231951523463 - acc: 0.7707 - val_acc: 0.7811\n",
      "Epoch 85 / 300 \n",
      " - time (s): 1.7436017990112305 - sq_loss: 2.7929966108786175e-06 - tot_loss: 3.2184078018947275 - acc: 0.7148833333333333 - val_acc: 0.7222\n",
      "Epoch 86 / 300 \n",
      " - time (s): 1.7843456268310547 - sq_loss: 4.657204044633545e-06 - tot_loss: 3.3386537040805706 - acc: 0.7818166666666667 - val_acc: 0.7902\n",
      "Epoch 87 / 300 \n",
      " - time (s): 1.7603447437286377 - sq_loss: 3.7576808153971797e-06 - tot_loss: 2.5499643514028776 - acc: 0.7235 - val_acc: 0.7321\n",
      "Epoch 88 / 300 \n",
      " - time (s): 1.7609553337097168 - sq_loss: 6.868692707939772e-06 - tot_loss: 3.314651025353214 - acc: 0.7389666666666667 - val_acc: 0.7453\n",
      "Epoch 89 / 300 \n",
      " - time (s): 1.7386829853057861 - sq_loss: 2.104118266288424e-06 - tot_loss: 2.8861221119318543 - acc: 0.7125333333333334 - val_acc: 0.7234\n",
      "Epoch 90 / 300 \n",
      " - time (s): 1.7448625564575195 - sq_loss: 4.114708190172678e-06 - tot_loss: 2.838648676394314 - acc: 0.77495 - val_acc: 0.7867\n",
      "Epoch 91 / 300 \n",
      " - time (s): 1.7605564594268799 - sq_loss: 1.7073026583602768e-06 - tot_loss: 2.519246313350891 - acc: 0.7662333333333333 - val_acc: 0.7752\n",
      "Epoch 92 / 300 \n",
      " - time (s): 1.7439591884613037 - sq_loss: 1.5909888588794274e-06 - tot_loss: 2.555388261202779 - acc: 0.7410666666666667 - val_acc: 0.7506\n",
      "Epoch 93 / 300 \n",
      " - time (s): 1.7478587627410889 - sq_loss: 1.5044611245684791e-06 - tot_loss: 2.75345054138279 - acc: 0.78535 - val_acc: 0.7935\n",
      "Epoch 94 / 300 \n",
      " - time (s): 1.7536506652832031 - sq_loss: 2.351694092794787e-06 - tot_loss: 2.7101352355703057 - acc: 0.7886 - val_acc: 0.7974\n",
      "Epoch 95 / 300 \n",
      " - time (s): 1.7775280475616455 - sq_loss: 5.401278940553311e-06 - tot_loss: 3.284212579544146 - acc: 0.7713666666666666 - val_acc: 0.7787\n",
      "Epoch 96 / 300 \n",
      " - time (s): 1.758554458618164 - sq_loss: 1.5596199318679282e-06 - tot_loss: 2.7847795869304264 - acc: 0.8010833333333334 - val_acc: 0.8102\n",
      "Epoch 97 / 300 \n",
      " - time (s): 1.7837090492248535 - sq_loss: 1.8774125010168063e-06 - tot_loss: 3.3413134348237463 - acc: 0.7661666666666667 - val_acc: 0.775\n",
      "Epoch 98 / 300 \n",
      " - time (s): 1.757633924484253 - sq_loss: 1.839624701460707e-06 - tot_loss: 2.821411883822975 - acc: 0.8057666666666666 - val_acc: 0.8139\n",
      "Epoch 99 / 300 \n",
      " - time (s): 1.7564032077789307 - sq_loss: 1.8157440990762552e-06 - tot_loss: 2.930948672626755 - acc: 0.7574833333333333 - val_acc: 0.7679\n",
      "Epoch 100 / 300 \n",
      " - time (s): 1.7545840740203857 - sq_loss: 7.678711881453637e-06 - tot_loss: 2.7230552234550487 - acc: 0.8009 - val_acc: 0.8102\n",
      "Epoch 101 / 300 \n",
      " - time (s): 1.752830982208252 - sq_loss: 2.2470849216915667e-05 - tot_loss: 2.775151305104373 - acc: 0.7102 - val_acc: 0.7163\n",
      "Epoch 102 / 300 \n",
      " - time (s): 1.7607338428497314 - sq_loss: 5.916893314861227e-06 - tot_loss: 2.3767442660882807 - acc: 0.8053666666666667 - val_acc: 0.815\n",
      "Epoch 103 / 300 \n",
      " - time (s): 1.7584724426269531 - sq_loss: 9.656723705120385e-06 - tot_loss: 2.6043009337299736 - acc: 0.79255 - val_acc: 0.8016\n",
      "Epoch 104 / 300 \n",
      " - time (s): 1.7550644874572754 - sq_loss: 8.072262062341906e-06 - tot_loss: 3.0193758167097258 - acc: 0.7723833333333333 - val_acc: 0.7789\n",
      "Epoch 105 / 300 \n",
      " - time (s): 1.7605671882629395 - sq_loss: 3.88729567930568e-05 - tot_loss: 3.4176584591805295 - acc: 0.7906833333333333 - val_acc: 0.8001\n",
      "Epoch 106 / 300 \n",
      " - time (s): 1.7427196502685547 - sq_loss: 2.2197687030711677e-06 - tot_loss: 2.6882004122030594 - acc: 0.7626 - val_acc: 0.7686\n",
      "Epoch 107 / 300 \n",
      " - time (s): 1.7442822456359863 - sq_loss: 1.2258897186256945e-05 - tot_loss: 3.234073330364481 - acc: 0.7807333333333333 - val_acc: 0.7864\n",
      "Epoch 108 / 300 \n",
      " - time (s): 1.7530193328857422 - sq_loss: 6.286154984991299e-06 - tot_loss: 2.714240429752408 - acc: 0.8196 - val_acc: 0.8264\n",
      "Epoch 109 / 300 \n",
      " - time (s): 1.7630586624145508 - sq_loss: 1.1740452464437112e-05 - tot_loss: 3.016842613073095 - acc: 0.8183666666666667 - val_acc: 0.8268\n",
      "Epoch 110 / 300 \n",
      " - time (s): 1.7471508979797363 - sq_loss: 2.7571642931434326e-05 - tot_loss: 2.639585053997507 - acc: 0.7753833333333333 - val_acc: 0.7858\n",
      "Epoch 111 / 300 \n",
      " - time (s): 1.7680377960205078 - sq_loss: 1.0713934898376465e-05 - tot_loss: 2.8368936309125274 - acc: 0.7831833333333333 - val_acc: 0.7938\n",
      "Epoch 112 / 300 \n",
      " - time (s): 1.7550361156463623 - sq_loss: 7.972790626809001e-06 - tot_loss: 2.654214109235909 - acc: 0.80315 - val_acc: 0.8142\n",
      "Epoch 113 / 300 \n",
      " - time (s): 1.7632977962493896 - sq_loss: 4.337142672738992e-05 - tot_loss: 2.5424561374229597 - acc: 0.8032166666666667 - val_acc: 0.8134\n",
      "Epoch 114 / 300 \n",
      " - time (s): 1.7835254669189453 - sq_loss: 5.192150274524465e-05 - tot_loss: 2.59465210900089 - acc: 0.8158666666666666 - val_acc: 0.8221\n",
      "Epoch 115 / 300 \n",
      " - time (s): 1.7596347332000732 - sq_loss: 3.9889961044536904e-05 - tot_loss: 3.0466611303309037 - acc: 0.7791333333333333 - val_acc: 0.7901\n",
      "Epoch 116 / 300 \n",
      " - time (s): 1.7619578838348389 - sq_loss: 1.2265425539226271e-05 - tot_loss: 2.679038000734181 - acc: 0.80165 - val_acc: 0.8109\n",
      "Epoch 117 / 300 \n",
      " - time (s): 1.7502505779266357 - sq_loss: 1.4857959058645065e-06 - tot_loss: 2.4020740951690414 - acc: 0.8214833333333333 - val_acc: 0.832\n",
      "Epoch 118 / 300 \n",
      " - time (s): 1.7554938793182373 - sq_loss: 2.2538399662153097e-06 - tot_loss: 2.442748907723626 - acc: 0.8261333333333334 - val_acc: 0.8329\n",
      "Epoch 119 / 300 \n",
      " - time (s): 1.767967700958252 - sq_loss: 7.530221864726627e-06 - tot_loss: 2.424958997786689 - acc: 0.8044333333333333 - val_acc: 0.8127\n",
      "Epoch 120 / 300 \n",
      " - time (s): 1.7518301010131836 - sq_loss: 9.009705536300316e-06 - tot_loss: 2.6074462752330874 - acc: 0.78775 - val_acc: 0.7971\n",
      "Epoch 121 / 300 \n",
      " - time (s): 1.8461065292358398 - sq_loss: 3.853799626085674e-06 - tot_loss: 2.3089851533727597 - acc: 0.8080333333333334 - val_acc: 0.8135\n",
      "Epoch 122 / 300 \n",
      " - time (s): 1.7545506954193115 - sq_loss: 1.0095499419549014e-05 - tot_loss: 2.4942047533359073 - acc: 0.82355 - val_acc: 0.8296\n",
      "Epoch 123 / 300 \n",
      " - time (s): 1.774341106414795 - sq_loss: 7.685732271056622e-06 - tot_loss: 3.067544354882557 - acc: 0.8349333333333333 - val_acc: 0.8403\n",
      "Epoch 124 / 300 \n",
      " - time (s): 1.7540462017059326 - sq_loss: 5.705206604034174e-06 - tot_loss: 2.612898088392285 - acc: 0.8025666666666667 - val_acc: 0.8083\n",
      "Epoch 125 / 300 \n",
      " - time (s): 1.7513697147369385 - sq_loss: 2.1563141672231723e-06 - tot_loss: 2.718439468907036 - acc: 0.7723666666666666 - val_acc: 0.7813\n",
      "Epoch 126 / 300 \n",
      " - time (s): 1.7526988983154297 - sq_loss: 2.344964059375343e-06 - tot_loss: 2.6991705712455314 - acc: 0.7914166666666667 - val_acc: 0.7996\n",
      "Epoch 127 / 300 \n",
      " - time (s): 1.7741632461547852 - sq_loss: 1.8172705722463434e-06 - tot_loss: 2.9112035691779283 - acc: 0.8355666666666667 - val_acc: 0.8443\n",
      "Epoch 128 / 300 \n",
      " - time (s): 1.7723171710968018 - sq_loss: 5.886705821467331e-06 - tot_loss: 2.5563363581491103 - acc: 0.824 - val_acc: 0.8297\n",
      "Epoch 129 / 300 \n",
      " - time (s): 1.7696404457092285 - sq_loss: 1.4232711009753984e-06 - tot_loss: 2.7989925478169653 - acc: 0.8300666666666666 - val_acc: 0.8356\n",
      "Epoch 130 / 300 \n",
      " - time (s): 1.760451316833496 - sq_loss: 1.4866635638099979e-06 - tot_loss: 2.7195870986723776 - acc: 0.8384666666666667 - val_acc: 0.8455\n",
      "Epoch 131 / 300 \n",
      " - time (s): 1.757875680923462 - sq_loss: 4.335239282227121e-06 - tot_loss: 2.4791880031680193 - acc: 0.8035833333333333 - val_acc: 0.8117\n",
      "Epoch 132 / 300 \n",
      " - time (s): 1.8090174198150635 - sq_loss: 1.6922624581638956e-06 - tot_loss: 2.488661587404067 - acc: 0.814 - val_acc: 0.8196\n",
      "Epoch 133 / 300 \n",
      " - time (s): 1.9576094150543213 - sq_loss: 5.362533556763083e-06 - tot_loss: 2.5811695380834863 - acc: 0.8292333333333334 - val_acc: 0.837\n",
      "Epoch 134 / 300 \n",
      " - time (s): 1.9050540924072266 - sq_loss: 2.4336802653124323e-06 - tot_loss: 2.4567351593175317 - acc: 0.80245 - val_acc: 0.8116\n",
      "Epoch 135 / 300 \n",
      " - time (s): 1.931473731994629 - sq_loss: 1.5015538110674242e-06 - tot_loss: 2.3707075604905867 - acc: 0.8403166666666667 - val_acc: 0.8476\n",
      "Epoch 136 / 300 \n",
      " - time (s): 1.870262861251831 - sq_loss: 1.5987413917173399e-06 - tot_loss: 2.461519873729003 - acc: 0.8148 - val_acc: 0.8236\n",
      "Epoch 137 / 300 \n",
      " - time (s): 1.7847533226013184 - sq_loss: 1.831711870181607e-06 - tot_loss: 3.1439795448609402 - acc: 0.8343 - val_acc: 0.8425\n",
      "Epoch 138 / 300 \n",
      " - time (s): 1.8195364475250244 - sq_loss: 1.4408592505787965e-06 - tot_loss: 2.4637921963599183 - acc: 0.7992833333333333 - val_acc: 0.8087\n",
      "Epoch 139 / 300 \n",
      " - time (s): 1.7672178745269775 - sq_loss: 2.4226217192335753e-06 - tot_loss: 2.77093027755177 - acc: 0.8241833333333334 - val_acc: 0.8304\n",
      "Epoch 140 / 300 \n",
      " - time (s): 1.7790074348449707 - sq_loss: 6.343942914099898e-06 - tot_loss: 2.76167559728583 - acc: 0.8040166666666667 - val_acc: 0.8098\n",
      "Epoch 141 / 300 \n",
      " - time (s): 1.7568302154541016 - sq_loss: 1.2302495633775834e-05 - tot_loss: 2.7897199525768883 - acc: 0.8024333333333333 - val_acc: 0.8104\n",
      "Epoch 142 / 300 \n",
      " - time (s): 1.7736973762512207 - sq_loss: 1.3473212675307877e-05 - tot_loss: 2.7555933323728823 - acc: 0.8270666666666666 - val_acc: 0.8335\n",
      "Epoch 143 / 300 \n",
      " - time (s): 1.7609355449676514 - sq_loss: 2.2684939722239505e-06 - tot_loss: 2.4935427817977143 - acc: 0.7258666666666667 - val_acc: 0.7304\n",
      "Epoch 144 / 300 \n",
      " - time (s): 1.7473528385162354 - sq_loss: 1.821010300773196e-06 - tot_loss: 2.5941604782510694 - acc: 0.8354 - val_acc: 0.8417\n",
      "Epoch 145 / 300 \n",
      " - time (s): 1.756981372833252 - sq_loss: 1.6163546661118744e-06 - tot_loss: 2.3496835012417705 - acc: 0.7666166666666666 - val_acc: 0.7736\n",
      "Epoch 146 / 300 \n",
      " - time (s): 1.756009817123413 - sq_loss: 2.0129423319303896e-06 - tot_loss: 2.316142058445166 - acc: 0.8011666666666667 - val_acc: 0.8115\n",
      "Epoch 147 / 300 \n",
      " - time (s): 1.7706482410430908 - sq_loss: 4.028377588838339e-06 - tot_loss: 2.880376744797104 - acc: 0.7683166666666666 - val_acc: 0.7787\n",
      "Epoch 148 / 300 \n",
      " - time (s): 1.8026223182678223 - sq_loss: 1.6325975593645126e-06 - tot_loss: 2.71716896772341 - acc: 0.8403333333333334 - val_acc: 0.846\n",
      "Epoch 149 / 300 \n",
      " - time (s): 1.7625491619110107 - sq_loss: 3.928039404854644e-06 - tot_loss: 2.6838702451577774 - acc: 0.7919666666666667 - val_acc: 0.7998\n",
      "Epoch 150 / 300 \n",
      " - time (s): 1.7817232608795166 - sq_loss: 2.0498970116022974e-05 - tot_loss: 2.4637046124807966 - acc: 0.7441 - val_acc: 0.7484\n",
      "Epoch 151 / 300 \n",
      " - time (s): 1.776914358139038 - sq_loss: 1.6029302059905604e-05 - tot_loss: 3.2116692693125515 - acc: 0.8299 - val_acc: 0.8377\n",
      "Epoch 152 / 300 \n",
      " - time (s): 1.800948143005371 - sq_loss: 7.789259143464733e-06 - tot_loss: 3.1118583423349264 - acc: 0.8292166666666667 - val_acc: 0.8338\n",
      "Epoch 153 / 300 \n",
      " - time (s): 1.7573881149291992 - sq_loss: 1.2443749710655538e-06 - tot_loss: 2.73670880487839 - acc: 0.7760666666666667 - val_acc: 0.7803\n",
      "Epoch 154 / 300 \n",
      " - time (s): 1.7586312294006348 - sq_loss: 5.964476713415934e-06 - tot_loss: 2.6839516831146284 - acc: 0.82885 - val_acc: 0.8349\n",
      "Epoch 155 / 300 \n",
      " - time (s): 1.7682483196258545 - sq_loss: 7.984805051819421e-06 - tot_loss: 2.615078517332222 - acc: 0.8157833333333333 - val_acc: 0.8177\n",
      "Epoch 156 / 300 \n",
      " - time (s): 1.7599411010742188 - sq_loss: 7.655979970877524e-06 - tot_loss: 2.881018611885338 - acc: 0.8419833333333333 - val_acc: 0.8504\n",
      "Epoch 157 / 300 \n",
      " - time (s): 1.7572352886199951 - sq_loss: 3.3407668524887413e-06 - tot_loss: 2.884342892224595 - acc: 0.8433166666666667 - val_acc: 0.8512\n",
      "Epoch 158 / 300 \n",
      " - time (s): 1.8142011165618896 - sq_loss: 1.5200373582047177e-06 - tot_loss: 2.575380650264151 - acc: 0.823 - val_acc: 0.8298\n",
      "Epoch 159 / 300 \n",
      " - time (s): 1.8166110515594482 - sq_loss: 1.5210646324703703e-06 - tot_loss: 2.6863798461238275 - acc: 0.76135 - val_acc: 0.7689\n",
      "Epoch 160 / 300 \n",
      " - time (s): 1.7987301349639893 - sq_loss: 1.49114430314512e-06 - tot_loss: 2.7876634553890653 - acc: 0.81925 - val_acc: 0.8229\n",
      "Epoch 161 / 300 \n",
      " - time (s): 1.8026773929595947 - sq_loss: 2.803976940413122e-06 - tot_loss: 2.7097654625843006 - acc: 0.6571833333333333 - val_acc: 0.6604\n",
      "Epoch 162 / 300 \n",
      " - time (s): 1.8241324424743652 - sq_loss: 5.089499609312043e-06 - tot_loss: 2.6372196110878576 - acc: 0.8358833333333333 - val_acc: 0.8437\n",
      "Epoch 163 / 300 \n",
      " - time (s): 1.81557297706604 - sq_loss: 1.656008294048661e-06 - tot_loss: 2.6763773361384438 - acc: 0.8338 - val_acc: 0.841\n",
      "Epoch 164 / 300 \n",
      " - time (s): 1.8649022579193115 - sq_loss: 1.1895091347469133e-06 - tot_loss: 2.5825978761187116 - acc: 0.7324166666666667 - val_acc: 0.7428\n",
      "Epoch 165 / 300 \n",
      " - time (s): 1.7655928134918213 - sq_loss: 1.3532920775105595e-06 - tot_loss: 2.677267137384092 - acc: 0.7550333333333333 - val_acc: 0.7626\n",
      "Epoch 166 / 300 \n",
      " - time (s): 1.7524981498718262 - sq_loss: 1.5403111319756135e-06 - tot_loss: 3.499631688637237 - acc: 0.8335333333333333 - val_acc: 0.8393\n",
      "Epoch 167 / 300 \n",
      " - time (s): 1.778165340423584 - sq_loss: 8.583583621657453e-06 - tot_loss: 2.651303726093829 - acc: 0.8332 - val_acc: 0.8389\n",
      "Epoch 168 / 300 \n",
      " - time (s): 1.7544925212860107 - sq_loss: 7.220545285235858e-06 - tot_loss: 2.416132605148505 - acc: 0.8120666666666667 - val_acc: 0.8185\n",
      "Epoch 169 / 300 \n",
      " - time (s): 1.7382140159606934 - sq_loss: 1.5144631788643892e-06 - tot_loss: 3.011798289969988 - acc: 0.8108333333333333 - val_acc: 0.8157\n",
      "Epoch 170 / 300 \n",
      " - time (s): 1.789212942123413 - sq_loss: 4.009497388324235e-06 - tot_loss: 2.855260222954712 - acc: 0.6749833333333334 - val_acc: 0.6797\n",
      "Epoch 171 / 300 \n",
      " - time (s): 1.7382709980010986 - sq_loss: 2.480945477145724e-05 - tot_loss: 2.622217566358813 - acc: 0.8270166666666666 - val_acc: 0.8327\n",
      "Epoch 172 / 300 \n",
      " - time (s): 1.7859792709350586 - sq_loss: 9.042628335009795e-06 - tot_loss: 2.490910981318848 - acc: 0.7741833333333333 - val_acc: 0.7863\n",
      "Epoch 173 / 300 \n",
      " - time (s): 1.7600650787353516 - sq_loss: 6.123242656030925e-06 - tot_loss: 3.0433992435978325 - acc: 0.6904166666666667 - val_acc: 0.696\n",
      "Epoch 174 / 300 \n",
      " - time (s): 1.7652242183685303 - sq_loss: 7.747529707557987e-06 - tot_loss: 2.7554272137376756 - acc: 0.8115 - val_acc: 0.8195\n",
      "Epoch 175 / 300 \n",
      " - time (s): 1.7666709423065186 - sq_loss: 3.9733781704853754e-06 - tot_loss: 2.6561589639491103 - acc: 0.8479333333333333 - val_acc: 0.855\n",
      "Epoch 176 / 300 \n",
      " - time (s): 1.7577974796295166 - sq_loss: 2.043413132923888e-06 - tot_loss: 2.614474409833292 - acc: 0.8398666666666667 - val_acc: 0.8474\n",
      "Epoch 177 / 300 \n",
      " - time (s): 1.7887835502624512 - sq_loss: 2.094379624395515e-06 - tot_loss: 2.879538000061757 - acc: 0.7973333333333333 - val_acc: 0.8024\n",
      "Epoch 178 / 300 \n",
      " - time (s): 1.7410879135131836 - sq_loss: 1.436541651855805e-06 - tot_loss: 2.6262421999329035 - acc: 0.8192333333333334 - val_acc: 0.83\n",
      "Epoch 179 / 300 \n",
      " - time (s): 1.7831339836120605 - sq_loss: 5.737004357797559e-06 - tot_loss: 2.6598882999160196 - acc: 0.8094333333333333 - val_acc: 0.8179\n",
      "Epoch 180 / 300 \n",
      " - time (s): 1.7514798641204834 - sq_loss: 4.147564141021576e-06 - tot_loss: 2.5090403591302675 - acc: 0.8402666666666667 - val_acc: 0.8482\n",
      "Epoch 181 / 300 \n",
      " - time (s): 1.812695026397705 - sq_loss: 5.459357453219127e-06 - tot_loss: 2.623014437113852 - acc: 0.7438833333333333 - val_acc: 0.7538\n",
      "Epoch 182 / 300 \n",
      " - time (s): 1.7746460437774658 - sq_loss: 8.86845009517856e-06 - tot_loss: 2.4876560351731314 - acc: 0.8169666666666666 - val_acc: 0.8261\n",
      "Epoch 183 / 300 \n",
      " - time (s): 1.7573907375335693 - sq_loss: 6.341898370010313e-06 - tot_loss: 2.540736765190559 - acc: 0.8381666666666666 - val_acc: 0.8466\n",
      "Epoch 184 / 300 \n",
      " - time (s): 1.7640469074249268 - sq_loss: 2.974635890495847e-06 - tot_loss: 2.4228568588393955 - acc: 0.8397666666666667 - val_acc: 0.8454\n",
      "Epoch 185 / 300 \n",
      " - time (s): 1.7971501350402832 - sq_loss: 1.443329779249325e-06 - tot_loss: 2.353213411812135 - acc: 0.8496333333333334 - val_acc: 0.8579\n",
      "Epoch 186 / 300 \n",
      " - time (s): 1.7656261920928955 - sq_loss: 2.0993722955608973e-06 - tot_loss: 2.7392659589643245 - acc: 0.8341166666666666 - val_acc: 0.8367\n",
      "Epoch 187 / 300 \n",
      " - time (s): 1.7783539295196533 - sq_loss: 3.2973664474411635e-06 - tot_loss: 2.5584799824616766 - acc: 0.7870166666666667 - val_acc: 0.7944\n",
      "Epoch 188 / 300 \n",
      " - time (s): 1.7658441066741943 - sq_loss: 1.9657359189295676e-06 - tot_loss: 2.598991798620318 - acc: 0.8277 - val_acc: 0.8348\n",
      "Epoch 189 / 300 \n",
      " - time (s): 1.762131690979004 - sq_loss: 2.227178583780187e-06 - tot_loss: 2.508778194994875 - acc: 0.8352666666666667 - val_acc: 0.845\n",
      "Epoch 190 / 300 \n",
      " - time (s): 1.7964422702789307 - sq_loss: 2.618996177261579e-06 - tot_loss: 2.691699918760378 - acc: 0.72225 - val_acc: 0.7314\n",
      "Epoch 191 / 300 \n",
      " - time (s): 1.7693047523498535 - sq_loss: 3.2194113828154514e-06 - tot_loss: 3.43579028937188 - acc: 0.8471 - val_acc: 0.8565\n",
      "Epoch 192 / 300 \n",
      " - time (s): 1.7948040962219238 - sq_loss: 1.3413635997494566e-06 - tot_loss: 2.6906428770279263 - acc: 0.8157666666666666 - val_acc: 0.8264\n",
      "Epoch 193 / 300 \n",
      " - time (s): 1.7681794166564941 - sq_loss: 1.0678281796572264e-05 - tot_loss: 2.544218802904652 - acc: 0.8014333333333333 - val_acc: 0.8062\n",
      "Epoch 194 / 300 \n",
      " - time (s): 1.757152795791626 - sq_loss: 1.851715387601871e-05 - tot_loss: 2.503946978753447 - acc: 0.7908333333333334 - val_acc: 0.7966\n",
      "Epoch 195 / 300 \n",
      " - time (s): 1.7451744079589844 - sq_loss: 1.4774764167668764e-05 - tot_loss: 2.3900908411305863 - acc: 0.8274 - val_acc: 0.8359\n",
      "Epoch 196 / 300 \n",
      " - time (s): 1.7843422889709473 - sq_loss: 5.962323939456837e-06 - tot_loss: 2.380959027269 - acc: 0.8253333333333334 - val_acc: 0.8356\n",
      "Epoch 197 / 300 \n",
      " - time (s): 1.7548573017120361 - sq_loss: 2.7770447559305467e-06 - tot_loss: 2.5838345453676084 - acc: 0.8451166666666666 - val_acc: 0.8512\n",
      "Epoch 198 / 300 \n",
      " - time (s): 1.7666938304901123 - sq_loss: 3.15217548632063e-05 - tot_loss: 2.556934992226161 - acc: 0.7517166666666667 - val_acc: 0.7604\n",
      "Epoch 199 / 300 \n",
      " - time (s): 1.8221650123596191 - sq_loss: 1.2641167813853826e-05 - tot_loss: 3.1555214502795934 - acc: 0.8179833333333333 - val_acc: 0.8262\n",
      "Epoch 200 / 300 \n",
      " - time (s): 1.7461042404174805 - sq_loss: 3.3482288017694373e-06 - tot_loss: 2.602619172838331 - acc: 0.85095 - val_acc: 0.8596\n",
      "Epoch 201 / 300 \n",
      " - time (s): 1.763904094696045 - sq_loss: 4.204639481031336e-06 - tot_loss: 2.2383259265461675 - acc: 0.8311666666666667 - val_acc: 0.8381\n",
      "Epoch 202 / 300 \n",
      " - time (s): 2.089708089828491 - sq_loss: 2.397955995547818e-06 - tot_loss: 2.3435414677701374 - acc: 0.82815 - val_acc: 0.8367\n",
      "Epoch 203 / 300 \n",
      " - time (s): 1.758923053741455 - sq_loss: 3.839682904072106e-06 - tot_loss: 2.4227894586983894 - acc: 0.8052666666666667 - val_acc: 0.8138\n",
      "Epoch 204 / 300 \n",
      " - time (s): 1.7546744346618652 - sq_loss: 1.1405288205423858e-05 - tot_loss: 2.832052645803742 - acc: 0.8469833333333333 - val_acc: 0.8572\n",
      "Epoch 205 / 300 \n",
      " - time (s): 1.7737758159637451 - sq_loss: 1.5718369468231685e-05 - tot_loss: 2.541248612209529 - acc: 0.84275 - val_acc: 0.852\n",
      "Epoch 206 / 300 \n",
      " - time (s): 2.1396710872650146 - sq_loss: 2.493474676157348e-05 - tot_loss: 2.5147447336057667 - acc: 0.8313166666666667 - val_acc: 0.8384\n",
      "Epoch 207 / 300 \n",
      " - time (s): 1.769667148590088 - sq_loss: 4.306766186346067e-06 - tot_loss: 2.790030692889104 - acc: 0.71945 - val_acc: 0.7297\n",
      "Epoch 208 / 300 \n",
      " - time (s): 1.776869535446167 - sq_loss: 3.4512997899582842e-06 - tot_loss: 3.0576772833339874 - acc: 0.81855 - val_acc: 0.8299\n",
      "Epoch 209 / 300 \n",
      " - time (s): 1.8395957946777344 - sq_loss: 4.299269676266704e-06 - tot_loss: 2.4210760628529897 - acc: 0.834 - val_acc: 0.8423\n",
      "Epoch 210 / 300 \n",
      " - time (s): 1.7466413974761963 - sq_loss: 3.1767276595928706e-06 - tot_loss: 2.771163594504287 - acc: 0.8335666666666667 - val_acc: 0.837\n",
      "Epoch 211 / 300 \n",
      " - time (s): 1.7547011375427246 - sq_loss: 1.5753071238577832e-06 - tot_loss: 2.605136044021947 - acc: 0.8014666666666667 - val_acc: 0.8056\n",
      "Epoch 212 / 300 \n",
      " - time (s): 1.7567894458770752 - sq_loss: 1.3294745713210432e-06 - tot_loss: 2.5606793931299308 - acc: 0.8235333333333333 - val_acc: 0.8316\n",
      "Epoch 213 / 300 \n",
      " - time (s): 1.7497129440307617 - sq_loss: 1.942307335411897e-06 - tot_loss: 2.680304485727447 - acc: 0.8436 - val_acc: 0.8527\n",
      "Epoch 214 / 300 \n",
      " - time (s): 1.7386887073516846 - sq_loss: 1.5579884120597853e-06 - tot_loss: 2.350567469948487 - acc: 0.8390333333333333 - val_acc: 0.8443\n",
      "Epoch 215 / 300 \n",
      " - time (s): 1.7694642543792725 - sq_loss: 4.802864623343339e-06 - tot_loss: 2.4011437674394074 - acc: 0.8073166666666667 - val_acc: 0.8143\n",
      "Epoch 216 / 300 \n",
      " - time (s): 1.7640578746795654 - sq_loss: 4.88479463456315e-06 - tot_loss: 2.602013877386071 - acc: 0.8337666666666667 - val_acc: 0.8382\n",
      "Epoch 217 / 300 \n",
      " - time (s): 1.7702713012695312 - sq_loss: 1.311304913542699e-06 - tot_loss: 2.8974369567758913 - acc: 0.8225 - val_acc: 0.8317\n",
      "Epoch 218 / 300 \n",
      " - time (s): 1.760251522064209 - sq_loss: 1.4152965377434157e-06 - tot_loss: 2.512934493407556 - acc: 0.7942166666666667 - val_acc: 0.8029\n",
      "Epoch 219 / 300 \n",
      " - time (s): 2.2711901664733887 - sq_loss: 1.773142685124185e-06 - tot_loss: 2.599551374190014 - acc: 0.8305 - val_acc: 0.8386\n",
      "Epoch 220 / 300 \n",
      " - time (s): 1.7751481533050537 - sq_loss: 2.885257572415867e-06 - tot_loss: 2.6926718936067573 - acc: 0.7802666666666667 - val_acc: 0.7896\n",
      "Epoch 221 / 300 \n",
      " - time (s): 2.0111796855926514 - sq_loss: 4.34983849117998e-06 - tot_loss: 2.562746044344749 - acc: 0.8318 - val_acc: 0.8371\n",
      "Epoch 222 / 300 \n",
      " - time (s): 1.9606270790100098 - sq_loss: 2.1037317310401704e-06 - tot_loss: 2.455580096511312 - acc: 0.8430166666666666 - val_acc: 0.8526\n",
      "Epoch 223 / 300 \n",
      " - time (s): 1.768505334854126 - sq_loss: 1.5336662499976228e-06 - tot_loss: 2.8334063376195218 - acc: 0.8168833333333333 - val_acc: 0.825\n",
      "Epoch 224 / 300 \n",
      " - time (s): 1.75783109664917 - sq_loss: 3.272572257628781e-06 - tot_loss: 2.9667963284539383 - acc: 0.8446666666666667 - val_acc: 0.8533\n",
      "Epoch 225 / 300 \n",
      " - time (s): 1.7463507652282715 - sq_loss: 3.1283732369047357e-06 - tot_loss: 2.563716547560716 - acc: 0.8195333333333333 - val_acc: 0.8267\n",
      "Epoch 226 / 300 \n",
      " - time (s): 1.7490150928497314 - sq_loss: 3.2547909540880937e-06 - tot_loss: 2.443020923571112 - acc: 0.8317666666666667 - val_acc: 0.8367\n",
      "Epoch 227 / 300 \n",
      " - time (s): 1.7710282802581787 - sq_loss: 2.271273615406244e-06 - tot_loss: 2.6447822716543214 - acc: 0.8579 - val_acc: 0.8657\n",
      "Epoch 228 / 300 \n",
      " - time (s): 1.7874865531921387 - sq_loss: 2.2572348825633526e-06 - tot_loss: 2.7751231428119354 - acc: 0.8123833333333333 - val_acc: 0.8187\n",
      "Epoch 229 / 300 \n",
      " - time (s): 1.7930691242218018 - sq_loss: 2.170909056076198e-06 - tot_loss: 2.427906101711187 - acc: 0.7633166666666666 - val_acc: 0.7698\n",
      "Epoch 230 / 300 \n",
      " - time (s): 1.7706372737884521 - sq_loss: 6.767949798813788e-06 - tot_loss: 2.5851177098770677 - acc: 0.8462666666666666 - val_acc: 0.8534\n",
      "Epoch 231 / 300 \n",
      " - time (s): 1.7611405849456787 - sq_loss: 1.8292981849299395e-06 - tot_loss: 2.9987134220870075 - acc: 0.7567333333333334 - val_acc: 0.7618\n",
      "Epoch 232 / 300 \n",
      " - time (s): 1.8005614280700684 - sq_loss: 1.8574737623566762e-06 - tot_loss: 2.4929676462579664 - acc: 0.80955 - val_acc: 0.819\n",
      "Epoch 233 / 300 \n",
      " - time (s): 1.753941535949707 - sq_loss: 2.0101686004636576e-06 - tot_loss: 2.431356474578706 - acc: 0.84545 - val_acc: 0.8521\n",
      "Epoch 234 / 300 \n",
      " - time (s): 1.7718591690063477 - sq_loss: 1.7374139815728995e-06 - tot_loss: 2.680849228216971 - acc: 0.7312333333333333 - val_acc: 0.7358\n",
      "Epoch 235 / 300 \n",
      " - time (s): 1.7792484760284424 - sq_loss: 1.0639362699293997e-05 - tot_loss: 2.390754677841869 - acc: 0.86045 - val_acc: 0.8674\n",
      "Epoch 236 / 300 \n",
      " - time (s): 1.767280101776123 - sq_loss: 2.7798378141596913e-06 - tot_loss: 2.5552504689258058 - acc: 0.8087166666666666 - val_acc: 0.8141\n",
      "Epoch 237 / 300 \n",
      " - time (s): 1.7536633014678955 - sq_loss: 1.3112721717334352e-05 - tot_loss: 2.6941071925157303 - acc: 0.7891666666666667 - val_acc: 0.7928\n",
      "Epoch 238 / 300 \n",
      " - time (s): 1.9139785766601562 - sq_loss: 1.4787397958571091e-05 - tot_loss: 2.5431630792481883 - acc: 0.8202166666666667 - val_acc: 0.8285\n",
      "Epoch 239 / 300 \n",
      " - time (s): 1.7875292301177979 - sq_loss: 3.0326400519697927e-05 - tot_loss: 2.5619954471621895 - acc: 0.85585 - val_acc: 0.8641\n",
      "Epoch 240 / 300 \n",
      " - time (s): 1.7767643928527832 - sq_loss: 5.441212124424055e-06 - tot_loss: 2.779045712130028 - acc: 0.7760166666666667 - val_acc: 0.7829\n",
      "Epoch 241 / 300 \n",
      " - time (s): 1.7820851802825928 - sq_loss: 4.249382527632406e-06 - tot_loss: 2.7456201167983636 - acc: 0.8521333333333333 - val_acc: 0.8602\n",
      "Epoch 242 / 300 \n",
      " - time (s): 1.779050350189209 - sq_loss: 4.956242264597677e-06 - tot_loss: 2.449501308828985 - acc: 0.8028833333333333 - val_acc: 0.8074\n",
      "Epoch 243 / 300 \n",
      " - time (s): 1.778848648071289 - sq_loss: 2.9281920888024615e-06 - tot_loss: 2.7323883457113425 - acc: 0.8273 - val_acc: 0.8314\n",
      "Epoch 244 / 300 \n",
      " - time (s): 1.9080407619476318 - sq_loss: 2.820335566866561e-06 - tot_loss: 2.5601949852132293 - acc: 0.79095 - val_acc: 0.798\n",
      "Epoch 245 / 300 \n",
      " - time (s): 1.7720372676849365 - sq_loss: 6.7926212068414316e-06 - tot_loss: 2.4315475998628244 - acc: 0.84315 - val_acc: 0.8507\n",
      "Epoch 246 / 300 \n",
      " - time (s): 1.7775540351867676 - sq_loss: 2.5126839773292886e-06 - tot_loss: 2.4311689690796356 - acc: 0.8280666666666666 - val_acc: 0.836\n",
      "Epoch 247 / 300 \n",
      " - time (s): 1.7827298641204834 - sq_loss: 2.2944595912122168e-06 - tot_loss: 2.522267611814641 - acc: 0.8253833333333334 - val_acc: 0.8351\n",
      "Epoch 248 / 300 \n",
      " - time (s): 1.7822301387786865 - sq_loss: 3.016868276972673e-06 - tot_loss: 2.6408211431205473 - acc: 0.8061833333333334 - val_acc: 0.8117\n",
      "Epoch 249 / 300 \n",
      " - time (s): 1.8628935813903809 - sq_loss: 3.7485906432266347e-06 - tot_loss: 2.4822984575321243 - acc: 0.8400666666666666 - val_acc: 0.846\n",
      "Epoch 250 / 300 \n",
      " - time (s): 1.7702264785766602 - sq_loss: 9.879480785457417e-06 - tot_loss: 2.5071124737860373 - acc: 0.8422 - val_acc: 0.849\n",
      "Epoch 251 / 300 \n",
      " - time (s): 1.7847094535827637 - sq_loss: 1.6780134046712192e-06 - tot_loss: 2.669358890664853 - acc: 0.8397166666666667 - val_acc: 0.8455\n",
      "Epoch 252 / 300 \n",
      " - time (s): 1.8300330638885498 - sq_loss: 1.430797738066758e-06 - tot_loss: 2.4074349163809075 - acc: 0.81725 - val_acc: 0.8277\n",
      "Epoch 253 / 300 \n",
      " - time (s): 1.7904102802276611 - sq_loss: 1.4748244439033442e-06 - tot_loss: 2.573560146908335 - acc: 0.8418 - val_acc: 0.8491\n",
      "Epoch 254 / 300 \n",
      " - time (s): 1.8770174980163574 - sq_loss: 4.69273618364241e-06 - tot_loss: 2.58894168513325 - acc: 0.8112166666666667 - val_acc: 0.8175\n",
      "Epoch 255 / 300 \n",
      " - time (s): 1.7973847389221191 - sq_loss: 1.1390083272999618e-05 - tot_loss: 2.543396923846558 - acc: 0.84395 - val_acc: 0.8498\n",
      "Epoch 256 / 300 \n",
      " - time (s): 1.7771000862121582 - sq_loss: 2.5626820843172027e-06 - tot_loss: 2.474260002937399 - acc: 0.8377166666666667 - val_acc: 0.8446\n",
      "Epoch 257 / 300 \n",
      " - time (s): 1.7805051803588867 - sq_loss: 3.680545660245116e-06 - tot_loss: 2.416556195023759 - acc: 0.8429166666666666 - val_acc: 0.8509\n",
      "Epoch 258 / 300 \n",
      " - time (s): 1.7873663902282715 - sq_loss: 8.47641786094755e-06 - tot_loss: 3.0731901266117347 - acc: 0.8053666666666667 - val_acc: 0.8087\n",
      "Epoch 259 / 300 \n",
      " - time (s): 1.8082914352416992 - sq_loss: 5.981347840133822e-06 - tot_loss: 2.6389197758448972 - acc: 0.7981333333333334 - val_acc: 0.8051\n",
      "Epoch 260 / 300 \n",
      " - time (s): 1.759565830230713 - sq_loss: 1.4074250429985113e-05 - tot_loss: 2.7671406488752837 - acc: 0.82975 - val_acc: 0.8454\n",
      "Epoch 261 / 300 \n",
      " - time (s): 1.7760968208312988 - sq_loss: 1.1517636266944464e-05 - tot_loss: 2.5772277711248535 - acc: 0.85805 - val_acc: 0.8655\n",
      "Epoch 262 / 300 \n",
      " - time (s): 1.7784302234649658 - sq_loss: 1.8685954273678362e-05 - tot_loss: 2.705622843983292 - acc: 0.84235 - val_acc: 0.8527\n",
      "Epoch 263 / 300 \n",
      " - time (s): 1.84456205368042 - sq_loss: 2.158865572710056e-05 - tot_loss: 2.4193286603476736 - acc: 0.8348666666666666 - val_acc: 0.8429\n",
      "Epoch 264 / 300 \n",
      " - time (s): 1.7476518154144287 - sq_loss: 1.4652697245765012e-05 - tot_loss: 2.580032193293846 - acc: 0.85755 - val_acc: 0.8661\n",
      "Epoch 265 / 300 \n",
      " - time (s): 1.762639045715332 - sq_loss: 9.886430234473664e-06 - tot_loss: 2.640090952479113 - acc: 0.7984666666666667 - val_acc: 0.8056\n",
      "Epoch 266 / 300 \n",
      " - time (s): 1.764280080795288 - sq_loss: 8.325728231284302e-06 - tot_loss: 2.3703114292102327 - acc: 0.8604666666666667 - val_acc: 0.8715\n",
      "Epoch 267 / 300 \n",
      " - time (s): 1.7520713806152344 - sq_loss: 4.230789727444062e-06 - tot_loss: 2.6322476959253436 - acc: 0.8557833333333333 - val_acc: 0.8627\n",
      "Epoch 268 / 300 \n",
      " - time (s): 1.7693376541137695 - sq_loss: 5.40189921593992e-06 - tot_loss: 2.5104374672619088 - acc: 0.8117166666666666 - val_acc: 0.8176\n",
      "Epoch 269 / 300 \n",
      " - time (s): 1.7878212928771973 - sq_loss: 3.4330087146372534e-06 - tot_loss: 3.5266422786598923 - acc: 0.8407166666666667 - val_acc: 0.8495\n",
      "Epoch 270 / 300 \n",
      " - time (s): 1.7660551071166992 - sq_loss: 1.0218405805062503e-05 - tot_loss: 2.9963663775051828 - acc: 0.83505 - val_acc: 0.8371\n",
      "Epoch 271 / 300 \n",
      " - time (s): 1.803307056427002 - sq_loss: 1.7413275372746284e-06 - tot_loss: 3.0615701161749485 - acc: 0.82825 - val_acc: 0.836\n",
      "Epoch 272 / 300 \n",
      " - time (s): 1.751030683517456 - sq_loss: 9.571594091539737e-06 - tot_loss: 2.757412509533424 - acc: 0.8391666666666666 - val_acc: 0.8471\n",
      "Epoch 273 / 300 \n",
      " - time (s): 1.7665696144104004 - sq_loss: 3.503266043480835e-06 - tot_loss: 2.51548476214316 - acc: 0.8383166666666667 - val_acc: 0.8428\n",
      "Epoch 274 / 300 \n",
      " - time (s): 1.7755272388458252 - sq_loss: 1.2549310213216813e-06 - tot_loss: 2.4415572155733116 - acc: 0.8547666666666667 - val_acc: 0.8607\n",
      "Epoch 275 / 300 \n",
      " - time (s): 1.7815961837768555 - sq_loss: 1.5897330740699545e-06 - tot_loss: 3.130710637295124 - acc: 0.74725 - val_acc: 0.7562\n",
      "Epoch 276 / 300 \n",
      " - time (s): 1.7671880722045898 - sq_loss: 9.873499948298559e-06 - tot_loss: 2.6479151686726254 - acc: 0.6304 - val_acc: 0.6368\n",
      "Epoch 277 / 300 \n",
      " - time (s): 1.7629508972167969 - sq_loss: 7.440611625497695e-06 - tot_loss: 2.5385838271313332 - acc: 0.8276833333333333 - val_acc: 0.8314\n",
      "Epoch 278 / 300 \n",
      " - time (s): 1.7622449398040771 - sq_loss: 8.905172762752045e-06 - tot_loss: 2.6156954936132024 - acc: 0.8519 - val_acc: 0.8574\n",
      "Epoch 279 / 300 \n",
      " - time (s): 1.7857065200805664 - sq_loss: 1.331495695922058e-06 - tot_loss: 2.3708040397787045 - acc: 0.7900166666666667 - val_acc: 0.797\n",
      "Epoch 280 / 300 \n",
      " - time (s): 1.7597384452819824 - sq_loss: 1.5207594969979255e-06 - tot_loss: 2.7599249762104137 - acc: 0.6534166666666666 - val_acc: 0.6631\n",
      "Epoch 281 / 300 \n",
      " - time (s): 1.7676010131835938 - sq_loss: 1.373139184579486e-06 - tot_loss: 2.876032406932154 - acc: 0.8430666666666666 - val_acc: 0.8518\n",
      "Epoch 282 / 300 \n",
      " - time (s): 1.8500854969024658 - sq_loss: 2.231185362688848e-06 - tot_loss: 2.525190689308374 - acc: 0.7480166666666667 - val_acc: 0.7574\n",
      "Epoch 283 / 300 \n",
      " - time (s): 1.7634835243225098 - sq_loss: 1.5595459217365715e-06 - tot_loss: 2.5082948916832493 - acc: 0.72815 - val_acc: 0.732\n",
      "Epoch 284 / 300 \n",
      " - time (s): 1.9223999977111816 - sq_loss: 1.274398346140515e-05 - tot_loss: 2.361660539991135 - acc: 0.8364 - val_acc: 0.8431\n",
      "Epoch 285 / 300 \n",
      " - time (s): 1.7664127349853516 - sq_loss: 1.4873078725941014e-05 - tot_loss: 2.8207636688593993 - acc: 0.7379833333333333 - val_acc: 0.7391\n",
      "Epoch 286 / 300 \n",
      " - time (s): 1.8581080436706543 - sq_loss: 7.356078185694059e-06 - tot_loss: 2.449144565519873 - acc: 0.7993 - val_acc: 0.8082\n",
      "Epoch 287 / 300 \n",
      " - time (s): 1.761686086654663 - sq_loss: 3.628229023888707e-06 - tot_loss: 2.5345961866842117 - acc: 0.8322666666666667 - val_acc: 0.8424\n",
      "Epoch 288 / 300 \n",
      " - time (s): 1.7788612842559814 - sq_loss: 7.269568413903471e-06 - tot_loss: 2.4411202597902957 - acc: 0.6933833333333334 - val_acc: 0.6952\n",
      "Epoch 289 / 300 \n",
      " - time (s): 1.7838172912597656 - sq_loss: 1.3434971606329782e-06 - tot_loss: 2.445359316194981 - acc: 0.83935 - val_acc: 0.8472\n",
      "Epoch 290 / 300 \n",
      " - time (s): 1.7529008388519287 - sq_loss: 1.6258322830253746e-06 - tot_loss: 2.5025618869744903 - acc: 0.80985 - val_acc: 0.8165\n",
      "Epoch 291 / 300 \n",
      " - time (s): 1.8403186798095703 - sq_loss: 3.008865178344422e-06 - tot_loss: 2.750003145249366 - acc: 0.7410166666666667 - val_acc: 0.7451\n",
      "Epoch 292 / 300 \n",
      " - time (s): 1.7717044353485107 - sq_loss: 1.463389821765304e-06 - tot_loss: 2.6919241866108905 - acc: 0.8336833333333333 - val_acc: 0.8424\n",
      "Epoch 293 / 300 \n",
      " - time (s): 1.9412224292755127 - sq_loss: 3.0460951165878214e-06 - tot_loss: 2.780603320909904 - acc: 0.7705 - val_acc: 0.7779\n",
      "Epoch 294 / 300 \n",
      " - time (s): 1.8060872554779053 - sq_loss: 1.6816311472211964e-06 - tot_loss: 3.0917071293742993 - acc: 0.84305 - val_acc: 0.851\n",
      "Epoch 295 / 300 \n",
      " - time (s): 1.7529034614562988 - sq_loss: 1.9646856799226953e-06 - tot_loss: 2.6201638910158636 - acc: 0.7810666666666667 - val_acc: 0.7855\n",
      "Epoch 296 / 300 \n",
      " - time (s): 1.764638900756836 - sq_loss: 2.082156242977362e-06 - tot_loss: 2.93786971530335 - acc: 0.8456333333333333 - val_acc: 0.8531\n",
      "Epoch 297 / 300 \n",
      " - time (s): 1.778740406036377 - sq_loss: 2.343496362300357e-06 - tot_loss: 2.8428686187376115 - acc: 0.84825 - val_acc: 0.8555\n",
      "Epoch 298 / 300 \n",
      " - time (s): 1.7519962787628174 - sq_loss: 1.6777598830231e-06 - tot_loss: 2.411193399381318 - acc: 0.8276 - val_acc: 0.8353\n",
      "Epoch 299 / 300 \n",
      " - time (s): 1.8926639556884766 - sq_loss: 3.9818091863708105e-06 - tot_loss: 2.3708948412727295 - acc: 0.7717833333333334 - val_acc: 0.7795\n",
      "Epoch 300 / 300 \n",
      " - time (s): 1.9921760559082031 - sq_loss: 2.4125026811816497e-06 - tot_loss: 2.758872166638639 - acc: 0.83825 - val_acc: 0.8434\n"
     ]
    }
   ],
   "source": [
    "# Iterations\n",
    "print('Train on', N, 'samples, validate on', N_test, 'samples')\n",
    "for k in range(niter):\n",
    "    start = time.time()\n",
    "\n",
    "    # update V11\n",
    "    V11 = (y_one_hot + gamma*U11 + alpha*V11)/(1 + gamma + alpha)\n",
    "    \n",
    "    # update U11\n",
    "    U11 = (gamma*V11 + rho*(torch.mm(W11, V10) + b11.repeat(1,N)))/(gamma + rho)\n",
    "    \n",
    "    # update W11, b11, V10 and U10\n",
    "    W11, b11, V10, U10 = block_update(W11, b11, W10, b10, V11, U11, V10, U10, V9, d10)\n",
    "    \n",
    "    # update W10, b10, V9 and U9\n",
    "    W10, b10, V9, U9 = block_update(W10, b10, W9, b9, V10, U10, V9, U9, V8, d9)\n",
    "    \n",
    "    # update W9, b9, V8 and U8\n",
    "    W9, b9, V8, U8 = block_update(W9, b9, W8, b8, V9, U9, V8, U8, V7, d8)\n",
    "    \n",
    "    # update W8, b8, V7 and U7\n",
    "    W8, b8, V7, U7 = block_update(W8, b8, W7, b7, V8, U8, V7, U7, V6, d7)\n",
    "    \n",
    "    # update W7, b7, V6 and U6\n",
    "    W7, b7, V6, U6 = block_update(W7, b7, W6, b6, V7, U7, V6, U6, V5, d6)\n",
    "    \n",
    "    # update W6, b6, V5 and U5\n",
    "    W6, b6, V5, U5 = block_update(W6, b6, W5, b5, V6, U6, V5, U5, V4, d5)\n",
    "    \n",
    "    # update W5, b5, V4 and U4\n",
    "    W5, b5, V4, U4 = block_update(W5, b5, W4, b4, V5, U5, V4, U4, V3, d4)\n",
    "    \n",
    "    # update W4, b4, V3 and U3\n",
    "    W4, b4, V3, U3 = block_update(W4, b4, W3, b3, V4, U4, V3, U3, V2, d3)\n",
    "    \n",
    "    # update W3, b3, V2 and U2\n",
    "    W3, b3, V2, U2 = block_update(W3, b3, W2, b2, V3, U3, V2, U2, V1, d2)\n",
    "    \n",
    "    # update W2, b2, V1 and U1\n",
    "    W2, b2, V1, U1 = block_update(W2, b2, W1, b1, V2, U2, V1, U1, x_train, d1)\n",
    "    \n",
    "    # update W1 and b1\n",
    "    W1, b1 = updateWb(U1, x_train, W1, b1, alpha, rho)\n",
    "\n",
    "    # compute updated training activations\n",
    "    _, a1_train = feed_forward(W1, b1, x_train)\n",
    "    _, a2_train = feed_forward(W2, b2, a1_train)\n",
    "    _, a3_train = feed_forward(W3, b3, a2_train)\n",
    "    _, a4_train = feed_forward(W4, b4, a3_train)\n",
    "    _, a5_train = feed_forward(W5, b5, a4_train)\n",
    "    _, a6_train = feed_forward(W6, b6, a5_train)\n",
    "    _, a7_train = feed_forward(W7, b7, a6_train)\n",
    "    _, a8_train = feed_forward(W8, b8, a7_train)\n",
    "    _, a9_train = feed_forward(W9, b9, a8_train)\n",
    "    _, a10_train = feed_forward(W10, b10, a9_train)\n",
    "    \n",
    "    \n",
    "    # training prediction\n",
    "    pred = torch.argmax(torch.addmm(b11.repeat(1, N), W11, a10_train), dim=0)\n",
    "    # pred = torch.argmax(torch.addmm(b4.repeat(1, N), W4, a3_train), dim=0)\n",
    "    \n",
    "    # compute test activations\n",
    "    _, a1_test = feed_forward(W1, b1, x_test, N_test)\n",
    "    _, a2_test = feed_forward(W2, b2, a1_test, N_test)\n",
    "    _, a3_test = feed_forward(W3, b3, a2_test, N_test)\n",
    "    _, a4_test = feed_forward(W4, b4, a3_test, N_test)\n",
    "    _, a5_test = feed_forward(W5, b5, a4_test, N_test)\n",
    "    _, a6_test = feed_forward(W6, b6, a5_test, N_test)\n",
    "    _, a7_test = feed_forward(W7, b7, a6_test, N_test)\n",
    "    _, a8_test = feed_forward(W8, b8, a7_test, N_test)\n",
    "    _, a9_test = feed_forward(W9, b9, a8_test, N_test)\n",
    "    _, a10_test = feed_forward(W10, b10, a9_test, N_test)\n",
    "    \n",
    "    # test/validation prediction\n",
    "    pred_test = torch.argmax(torch.addmm(b11.repeat(1, N_test), W11, a10_test), dim=0)\n",
    "    # pred_test = torch.argmax(torch.addmm(b4.repeat(1, N_test), W4, a3_test), dim=0)\n",
    "    \n",
    "    # compute training loss\n",
    "    loss1[k] = gamma/2*torch.pow(torch.dist(V11,y_one_hot,2),2).cpu().numpy()\n",
    "    loss2[k] = loss1[k] \\\n",
    "    + compute_loss(W1, b1, x_train, U1) \\\n",
    "    + compute_loss(W2, b2, V1, U2) \\\n",
    "    + compute_loss(W3, b3, V2, U3) \\\n",
    "    + compute_loss(W4, b4, V3, U4) \\\n",
    "    + compute_loss(W5, b5, V4, U5) \\\n",
    "    + compute_loss(W6, b6, V5, U6) \\\n",
    "    + compute_loss(W7, b7, V6, U7) \\\n",
    "    + compute_loss(W8, b8, V7, U8) \\\n",
    "    + compute_loss(W9, b9, V8, U9) \\\n",
    "    + compute_loss(W10, b10, V9, U10) \\\n",
    "    + compute_loss(W11, b11, V10, U11) \n",
    "    \n",
    "    # compute training accuracy\n",
    "    correct_train = pred == y_train\n",
    "    accuracy_train[k] = np.mean(correct_train.cpu().numpy())\n",
    "    \n",
    "    # compute validation accuracy\n",
    "    correct_test = pred_test == y_test\n",
    "    accuracy_test[k] = np.mean(correct_test.cpu().numpy())\n",
    "    \n",
    "    # compute training time\n",
    "    stop = time.time()\n",
    "    duration = stop - start\n",
    "    time1[k] = duration\n",
    "    \n",
    "    # print results\n",
    "    print('Epoch', k + 1, '/', niter, '\\n', \n",
    "          '-', 'time (s):', time1[k], '-', 'sq_loss:', loss1[k], '-', 'tot_loss:', loss2[k], \n",
    "          '-', 'acc:', accuracy_train[k], '-', 'val_acc:', accuracy_test[k])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Visualization of training results"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x7f56606836d8>"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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fX0dHCpluubXT/CzFc/UuxlmZgOaQ6VMP7jnSW5+uNLbc5vZQLZhwwaOOOIIjjjiCA488EDGjh276/G2bdvK2se5557L6tWri9a58sorufbaa6vRZI455hgefPDBquyrmnyivkyNDWLHTl980+z1aPTo0bveoL/4xS8yfPhwPvWpT+1WJyKICBoa8n8Wv/rqq0s+z3nnndf3xg5w7qmUqUHCmWK2d1m7di1Tp07lIx/5CNOnT2fdunXMmzePGTNmMGXKFC6++OJddbt7Dl1dXbS1tTF//nymTZvGu971LtavXw/ABRdcwNe+9rVd9efPn8+RRx7JYYcdxq9//WsAXnrpJU4//XSmTZvGWWedxYwZM0r2SH7wgx/w1re+lalTp/L5z38egK6uLj784Q/vKr/iiisAuPzyy5k8eTLTpk3j7LN73viz79xTKVNDA+z0bQLMau6in63k0Wc2V3Wfkw8eyYXvn1LRto8++ihXX301V111FQCXXnop++23H11dXbznPe/hjDPOYPLkybtt88ILL3Dsscdy6aWX8slPfpKFCxcyf/78PfYdESxbtozFixdz8cUXc+utt/KNb3yDAw88kBtvvJEVK1YwfXrxO2V3dHRwwQUXsHz5ckaNGsWJJ57Iz3/+c9rb23nuued4+OGHAdi0aRMAX/nKV3jyyScZMmTIrrJqck+lTI3y8JfZ3uhNb3oT73jHO3Y9vu6665g+fTrTp09n1apVPProo3tsM3ToUE455RQA3v72t/PEE0/k3fcHP/jBPer86le/Yvbs2QBMmzaNKVOKh+HSpUs5/vjjGTNmDM3NzXzoQx/il7/8JYceeiirV6/m/PPPZ8mSJYwaNQqAKVOmcPbZZ3PttddW/AXHYtxTKVNDg9xTMesHlfYoamXYsGG7ltesWcPXv/51li1bRltbG2effXbe73QMGTJk13JjYyNdXV15993S0rJHnd7eOLFQ/dGjR/PQQw9xyy23cMUVV3DjjTeyYMEClixZwt13381NN93El7/8ZR555BEaGxt79ZzFuKdSJvdUzGzz5s2MGDGCkSNHsm7dOpYsWVL15zjmmGO4/vrrAXj44Yfz9oRyHXXUUdx5551s2LCBrq4uFi1axLHHHktnZycRwZlnnslFF13E/fffz44dO+jo6OD444/nq1/9Kp2dnbz88stVbb97KmVq8Owv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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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JrR5fiLCvvvumyw/XlLiTOR19tln8+tf/5o777yTxx57jIsuuqjd1+uorI0piIgXeBCYCAwDponIsBa7/Ru4CPhztuJIp+/W5awIjKVO89g3tj65vT7Q9I2jkEY+KSln4MBBAAQKLCkY09Jpp53G4sWLk7OqJb7hz5s3j02bNvH+++/z4Ycf0r9//7TlslOla0V88cUX/Pa3v2Xx4sWsWrWKU045pd3jtFXPLVF2G1ovz3311VczY8YMVq9ezUMPPZR8vXQlrzMprw3NS2ynltdu7fxaO25BQQEnnHACzz//PAsWLOA//qPrqzRnc6B5PFChqp+rahiYDzTrVFTVdaq6Cthtoy1b1v+LQfEqGgYdxf/kN/+2Ec9zPvhD+AEYcOz05GOFRU0VF0OF++2GSI3p+YqKijj22GO55JJLmg0wJ8pG+/1+lixZwr/+9a82j3P00Uczb948AD766CNWrVoFOGW3CwsL6dWrFxs3buSll15KPqe4uJgdO3akPdZzzz1HfX09dXV1PPvssxx11FEZn1NNTQ0DBw4E4PHHH09uP/HEE3nggQeS69u2beM73/kO//jHP/jiiy+A5uW1V6xYAcCKFSuSj7fU2vkdcsghVFVVsWzZMgB27NiRTGDTp09n5syZHH744Rm1TDoqm0lhIPBlynqlu63DRORyEVkuIss3bdrUqWDe/eu9/OumYUQe+j4A/b59HNEDygH4HKc10Bhzpr5766CfwpVv03/s5OTzB39rDMv6TOKq8Ex0SOZ/YMbs6aZNm8bKlSs599xzk9vOO+88li9fzrhx45g3b167E8ZceeWV1NbWMmLECO644w7Gj3e6bUeOHMno0aM57LDDuOSSS5qV3b788suTg7apxowZw0UXXcT48eM54ogjmD59OqNHj874fG688UbOPvtsjjrqqGbjFbNnz2bbtm0MHz6ckSNHsmTJEvr27cvDDz/MGWecwciRI5Mlr88880y2bt3KqFGjmDNnDt/85jfTvlZr5xcIBHj66ae5+uqrGTlyJCeccEKytTF27FhKSkqyNudC1kpni8jZwA9Udbq7/kNgvKpenWbfPwEvZjKm0NnS2asWP0VspTMJR7SgP2OnP0A8XMv6dxcQHH0ub/6fJznm1At5/YW5nHzOleTnpR9u2VIbYp/CQKsDZsbsLlY6e+9UVVXFscceyz//+U88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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig_loss = plt.figure(1)\n",
    "plt.plot(np.arange(1, niter + 1), loss2, label='Training loss')\n",
    "#plt.plot(np.arange(1, niter + 1), loss4, label='Validation loss')\n",
    "plt.title('Ten-layer MLP (BCD)')\n",
    "plt.xlabel('Epochs')\n",
    "plt.ylabel('Loss')\n",
    "plt.legend()\n",
    "\n",
    "# Plot of Accuracies\n",
    "fig_accuracy = plt.figure(2)\n",
    "plt.plot(np.arange(1, niter + 1), accuracy_train, label='Training accuracy', linewidth=1.5)\n",
    "plt.plot(np.arange(1, niter + 1), accuracy_test, label='Validation accuracy', linewidth=1.5)\n",
    "plt.title('Ten-layer MLP (BCD)')\n",
    "plt.xlabel('Epochs')\n",
    "plt.ylabel('Accuracy')\n",
    "plt.legend()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
